/*
 * 虚拟内存管理头文件
 * 定义页表管理和虚拟内存操作的接口
 */

#ifndef VM_H
#define VM_H

#include "../fs/types.h"
#include "riscv.h"

// 页表管理接口
pagetable_t create_pagetable(void);                    // 创建新页表
void destroy_pagetable(pagetable_t pt);                 // 销毁页表
pte_t* walk(pagetable_t pagetable, uint64 va, int alloc); // 页表遍历
int map_pages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm); // 建立映射
uint64 walkaddr(pagetable_t pagetable, uint64 va);     // 虚拟地址转物理地址

// 内核虚拟内存管理
void kvminit(void);                                     // 初始化内核页表
void kvminithart(void);                                 // 激活内核页表
void kvmmap(pagetable_t kpgtbl, uint64 va, uint64 pa, uint64 sz, int perm); // 内核映射

// 用户虚拟内存管理
pagetable_t uvmcreate(void);                           // 创建用户页表
void uvmfree(pagetable_t pagetable, uint64 sz);        // 释放用户页表

// 调试和工具函数
void dump_pagetable(pagetable_t pt, int level);        // 打印页表内容
void print_mappings(pagetable_t pt);                   // 打印地址映射

// 全局变量声明
extern pagetable_t kernel_pagetable;                   // 内核页表

#endif // VM_H